/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package bs.tesoreria.modelo;

import bs.entidad.modelo.EntidadComercial;
import bs.global.modelo.Auditoria;
import bs.global.modelo.Formulario;
import bs.global.modelo.Moneda;
import bs.ventas.modelo.Cobrador;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinColumns;
import javax.persistence.Lob;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

/**
 *
 * @author Claudio
 */
@Entity
@Table(name = "cj_movimiento")
public class MovimientoTesoreria implements Serializable {
    private static final long serialVersionUID = 1L;
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)    
    @Column(name = "ID", nullable = false)
    private Integer id;
    
    @JoinColumns({
    @JoinColumn(name = "MODFOR", referencedColumnName = "MODFOR", nullable = false),
    @JoinColumn(name = "CODFOR", referencedColumnName = "CODFOR", nullable = false)
    })
    @ManyToOne(fetch = FetchType.LAZY)
    Formulario formulario;
            
    @Column(name = "NROFOR", nullable = false)
    private int numeroFormulario;
    
    @NotNull
    @Column(name = "FCHMOV", nullable = false)
    @Temporal(TemporalType.DATE)
    private Date fechaMovimiento;
    @Size(max = 13)
    
    @Column(name = "TIPMOV")
    private Integer tipoMovimiento;
    
    @JoinColumn(name = "DEBCTA", referencedColumnName = "CODIGO", nullable = false)
    @ManyToOne(fetch = FetchType.LAZY)
    private CuentaTesoreria cuentaTesoreriaDebe;
    
    @JoinColumn(name = "HABCTA", referencedColumnName = "CODIGO", nullable = true)
    @ManyToOne(fetch = FetchType.LAZY)
    private CuentaTesoreria cuentaTesoreriaHaber;
    
    @JoinColumn(name = "NROENT", referencedColumnName = "NROCTA", nullable = true)
    @ManyToOne(fetch = FetchType.LAZY)
    private EntidadComercial entidadComercial;
    
    @Column(name = "NOMENT", length = 120)
    private String nombreEntidad;
        
    @JoinColumn(name = "ID_REV", referencedColumnName = "ID", nullable = false)
    @OneToOne(fetch = FetchType.LAZY)
    private MovimientoTesoreria movimientoReversion;
        
    @JoinColumn(name = "COBRAD", referencedColumnName = "CODIGO", nullable = false)
    @ManyToOne(fetch = FetchType.LAZY)
    private Cobrador cobrador;
    
    //Moneda secundaria
    @JoinColumn(name = "COFSEC", referencedColumnName = "CODIGO", nullable = false)
    @ManyToOne(fetch = FetchType.LAZY)
    private Moneda monedaSecundaria;
        
    @Column(name = "COTIZA", precision = 15, scale = 4)
    private BigDecimal cotizacion;
    
    @Lob
    @Size(max = 2147483647)
    @Column(name = "OBSERV", length = 2147483647)
    private String observaciones;
    
    @OneToMany(mappedBy = "movimiento", fetch=FetchType.LAZY, cascade=CascadeType.ALL)
    private List<ItemDebeTesoreria> itemsDebe;
    
    @OneToMany(mappedBy = "movimiento", fetch=FetchType.LAZY, cascade=CascadeType.ALL)
    private List<ItemHaberTesoreria> itemsHaber;
    
    @Embedded
    private Auditoria auditoria;
    
    @Transient
    private boolean persistido;
    

    public MovimientoTesoreria() {
        
        auditoria = new Auditoria();
        this.cotizacion = BigDecimal.ONE;
        this.persistido = false;
        
        itemsDebe = new ArrayList<ItemDebeTesoreria>();
        itemsHaber= new ArrayList<ItemHaberTesoreria>();

        
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Formulario getFormulario() {
        return formulario;
    }

    public void setFormulario(Formulario formulario) {
        this.formulario = formulario;
    }

    public int getNumeroFormulario() {
        return numeroFormulario;
    }

    public void setNumeroFormulario(int numeroFormulario) {
        this.numeroFormulario = numeroFormulario;
    }
    
    public Date getFechaMovimiento() {
        return fechaMovimiento;
    }

    public void setFechaMovimiento(Date fechaMovimiento) {
        this.fechaMovimiento = fechaMovimiento;
    }

    public EntidadComercial getEntidadComercial() {
        return entidadComercial;
    }

    public void setEntidadComercial(EntidadComercial entidadComercial) {
        this.entidadComercial = entidadComercial;
    }

    public String getNombreEntidad() {
        return nombreEntidad;
    }

    public void setNombreEntidad(String nombreEntidad) {
        this.nombreEntidad = nombreEntidad;
    }

    public Integer getTipoMovimiento() {
        return tipoMovimiento;
    }

    public void setTipoMovimiento(Integer tipoMovimiento) {
        this.tipoMovimiento = tipoMovimiento;
    }
    
    public CuentaTesoreria getCuentaTesoreriaDebe() {
        return cuentaTesoreriaDebe;
    }

    public void setCuentaTesoreriaDebe(CuentaTesoreria cuentaTesoreriaDebe) {
        this.cuentaTesoreriaDebe = cuentaTesoreriaDebe;
    }

    public CuentaTesoreria getCuentaTesoreriaHaber() {
        return cuentaTesoreriaHaber;
    }

    public void setCuentaTesoreriaHaber(CuentaTesoreria cuentaTesoreriaHaber) {
        this.cuentaTesoreriaHaber = cuentaTesoreriaHaber;
    }
    
    public MovimientoTesoreria getMovimientoReversion() {
        return movimientoReversion;
    }

    public void setMovimientoReversion(MovimientoTesoreria movimientoReversion) {
        this.movimientoReversion = movimientoReversion;
    }

    public Cobrador getCobrador() {
        return cobrador;
    }

    public void setCobrador(Cobrador cobrador) {
        this.cobrador = cobrador;
    }

    public String getObservaciones() {
        return observaciones;
    }

    public void setObservaciones(String observaciones) {
        this.observaciones = observaciones;
    }

    public Auditoria getAuditoria() {
        return auditoria;
    }

    public void setAuditoria(Auditoria auditoria) {
        this.auditoria = auditoria;
    }
    
public Moneda getMonedaSecundaria() {
        return monedaSecundaria;
    }

    public void setMonedaSecundaria(Moneda monedaSecundaria) {
        this.monedaSecundaria = monedaSecundaria;
    }

    public BigDecimal getCotizacion() {
        return cotizacion;
    }

    public void setCotizacion(BigDecimal cotizacion) {
        this.cotizacion = cotizacion;
    }

    public List<ItemDebeTesoreria> getItemsDebe() {
        return itemsDebe;
    }

    public void setItemsDebe(List<ItemDebeTesoreria> itemsDebe) {
        this.itemsDebe = itemsDebe;
    }

    public List<ItemHaberTesoreria> getItemsHaber() {
        return itemsHaber;
    }

    public void setItemsHaber(List<ItemHaberTesoreria> itemsHaber) {
        this.itemsHaber = itemsHaber;
    }

    public boolean isPersistido() {
        return persistido;
    }

    public void setPersistido(boolean persistido) {
        this.persistido = persistido;
    }
    

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 89 * hash + (this.id != null ? this.id.hashCode() : 0);
        return hash;
    }
    
    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final MovimientoTesoreria other = (MovimientoTesoreria) obj;
        if (this.id != other.id && (this.id == null || !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }
    

    @Override
    public String toString() {
        return "bs.tesoreria.modelo.MovimientoTesoreria[ id=" + id + " ]";
    }
    
}
